CodeReading 5 장 5.3 중 프로세서가 프로세스로 잘못 되어 있는 부분을 수정한 것입니다.


5.3 병렬성

환경에 대한 반응성을 개선하기 위해서, 또는 작업 할당을 조직화하기 위해서, 아니면 여러 대의 컴퓨터들 또는 프로세서가 여러 개인 컴퓨터를 효과적으로 사용하기 위해서 코드의 여러 부분들을 병렬적으로 실행하는 프로그램들이 있다. 그러나 그런 프로그램의 설계, 구현 방법은 완전히 성숙한 것이 아니며 지금도 연구가 한창 진행중인 주제라 할 수 있다. 따라서 그런 프로그램에 대한 추상들 및 프로그래밍 모형들은 대단히 다양하다. 이번 절에서 살펴보게 될 것은 비교적 흔히 볼 수 있는 작업 분산 모형들의 몇 가지 대표적인 사례들이다. 미세한 단위(fine-grained)의 병렬성(parallelism)이나 벡터 연산(vector computation) 같은 좀 더 특별한 구현들은 다루지 않는다. 연산들을 병렬적으로 수행할 수 있는 능력은 하드웨어 계층에서 제공할 수도 있고 소프트웨어적으로 얻을 수도 있다.

5.3.1 하드웨어 병렬성과 소프트웨어 병렬성

하드웨어 계층에서 볼 수 있는 병렬성들은 대략 다음과 같이 분류할 수 있다.

하나의 프로세서 안에 여러 개의 실행 단위들이 작동

독자가 컴파일러나 어셈블러를 만들고 있는 것이 아니라면, 이런 유의 병렬성은 명령 동기화의 부담을 프로그래머에게 지우는 프로세서 아키텍처를 위한 기호 코드를 읽거나 쓰는 경우에만 취급하게 된다.

지능적으로 통합된 또는 외부의 주변장치

요즘의 주변 장치(디스크나 테이프 드라이브, 그래픽 어댑터나 네트웍 어댑터, 프린터 등)들은 대부분 독자적인 프로세서를 장착하고 있으며 고수준의 명령들(디스크의 트랙에 기록하라, 다각형을 그려라 등)을 컴퓨터의 메인 프로세서와 병렬적으로 수행하는 능력을 가지고 있다. 이런 장치들을 위한 코드는 운영체제 및 장치 드라이버와 격리되어서 추상화된다.

하드웨어적인 다중 태스킹 지원

요즘의 프로세서들은 대부분 여러 개의 작업들이 마치 병렬적으로 실행되는 것처럼 보이도록 운영체제가 작업들을 관리할 수 있게 하는 기능성(인터럽트, 메모리 관리 하드웨어 등)을 갖추고 있다. 그리고 그런 기능성을 구현하는 코드는 일반적으로 운영체제 안에 포함되어 있다. 이번 절에서는 그런 코드에서 병렬적으로 실행되는 작업들을 캡슐화하는 추상으로 흔히 쓰이는 프로세스와 스레드에 대해 살펴볼 것이다.

프로세서가 여러 개인 컴퓨터

이제는 이런 컴퓨터들도 드물지 않아서, 여러 개의 프로세서들을 잘 활용할 수 있도록 소프트웨어를 구현해야 한다는 요구가 점점 더 높아지고 있다. 운영체제가 내부적으로 프로세서들에 작업을 분산시킬 때 이를 추상화하는 수단으로 흔히 쓰이는 것 역시 프로세스와 스레드이다. 이처럼 단일 프로세서의 다중 작업과 다중 프로세서 환경에서의 다중 작업이 동일한 추상들을 사용하게 되면 서로 다른 하드웨어 구조들 사이에서의 코드 이식성을 높일 수 있다.

비교적 큰 단위의 분산 모형

대량의 컴퓨팅 자원들을 필요로 하는 문제들을 풀거나 성능 및 신뢰성을 향상시키고자 할 때, 네트웍으로 연결된 컴퓨터들을 병렬적으로 실행하는 기법이 점점 더 많이 쓰이고 있다. 이런 시스템의 대표적인 예로는 과학 계산(커다란 수의 계승 구하기, 외계 지성의 탐색 등) 시스템과 여러 대의 서버들에 기반한 집중화된 전자 상거래 기반 구조 등을 들 수 있다. 이런 시스템들의 경우 기존의 클러스터링 운영체제들, 미들웨어, 응용 프로그램들에 의존해서 만들기도 하고, 아니면 기본적인 네트워킹 기반 위에서 작성하기도 한다.